<?php


namespace Xiaoguai\DesignPattern\DP019;


abstract class AbstractClass
{
    /**
     * 模板方法
     */
    public function templateMethod()
    {
        // self
        $this->specificMethod();

        // sub_class
        $this->abstractMethod1();
        $this->abstractMethod2();
    }

    /**
     * 父类允许子类修改实现的方法
     * @return string
     */
    public function specificMethod()
    {
        return __CLASS__ . '::' . __METHOD__;
    }

    // 将实现推迟到子类实现的方法
    abstract public function abstractMethod1();
    abstract public function abstractMethod2();
}